package org.spring.bean.factory.config;

import com.sun.istack.internal.Nullable;

/**
 * BeanDefinition 描述了一个 bean 实例，它具有属性值、构造函数参数值以及具体实现提供的更多信息。
 * <p>
 * 这只是一个最小接口：主要目的是允许 {@link BeanFactoryPostProcessor} 内省和修改属性值和其他 bean 元数据。
 *
 * @author 李坤
 * @date 2022/4/20 17:37
 */
public interface BeanDefinition {

    /**
     * 获取 bean 的类型
     *
     * @return bean 的类型
     */
    Class<?> getBeanClass();

    /**
     * 设置 bean 的类型
     *
     * @param beanClass bean 的类型
     */
    void setBeanClass(@Nullable Class<?> beanClass);

    /**
     * 返回此 bean 定义的当前 bean 类名。
     * 请注意，这不一定是运行时使用的实际类名，以防子定义覆盖从其父类继承类名。
     * 此外，这可能只是调用工厂方法的类，或者在调用方法的工厂 bean 引用的情况下它甚至可能是空的。
     * 因此，not 是否将其视为运行时确定的 bean 类型，而仅在单个 bean 定义级别将其用于解析目的。
     *
     * @see #getParentName()
     * @see #getFactoryBeanName()
     * @see #getFactoryMethodName()
     */
    String getBeanClassName();

    /**
     * 指定此 bean 定义的 bean 类名。
     * 类名可以在 bean 工厂后处理期间修改，通常用它的解析变体替换原始类名。
     *
     * @see #setParentName
     * @see #setFactoryBeanName
     * @see #setFactoryMethodName
     */
    void setBeanClassName(String beanClassName);

}
